#ifndef _VL_TIMER__H_
#define _VL_TIMER__H_

#include <chrono>
#include <functional>
#include <thread>
#include <memory>
#include <mutex>
#include <condition_variable>

namespace VL {

/**
 * @Author: CimZzz
 * @Date: 2022-09-05 11:09:31
 * 
 * 定时器
 */
class VLTimer {
public:
	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 11:12:36
	 * 
	 * 定时器回调
	 */
	using TimerCallback = std::function<void()>;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 11:09:44
	 * 
	 * 构造函数
	 * 
	 * @param callback 定时器回调
	 * @param begin 是否立刻开始定时器
	 * @param period 定时间触发间隔时间, 单位毫秒
	 */
	explicit VLTimer(TimerCallback callback, bool begin = true, time_t period = 1000);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 11:13:48
	 * 
	 * 析构函数
	 */
	~VLTimer();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 11:11:34
	 * 
	 * 开始调度
	 */
	void beginSchedule();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 11:11:50
	 * 
	 * 停止调度
	 */
	void stopSchedule();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-07 16:35:14
	 * 
	 * 立即调度一次
	 */
	void scheduleOnce();

	/**
	 * @Author: CimZzz
	 * @Date: 2023-02-28 15:13:53
	 * 
	 * 等待计时器停止
	 */
	void waitTimerStop();

private:
	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 11:16:49
	 * 
	 * 线程锁
	 */
	std::mutex mutex;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 11:18:00
	 * 
	 * 线程指针
	 */
	std::shared_ptr<std::thread> threadPtr;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 11:12:55
	 * 
	 * 定时器回调
	 */
	TimerCallback callback;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 11:10:37
	 * 
	 * 触发间隔时间, 单位毫秒
	 */
	time_t period;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-05 11:10:50
	 * 
	 * 定时器是否已经开始调度
	 */
	volatile bool isBegin;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-07 17:58:28
	 * 
	 * 是否调度次数
	 */
	volatile uint16_t manualScheduleCount;
};

};

#endif // _VL_TIMER__H_
